#ifndef mapgen_hpp
#define mapgen_hpp

#include <vector>
#include <string>
#include "main.hpp"

#define TILE_COUNT         11
#define MAP_TYPE_COUNT     7

#define MAP_TYPE_GRASSLAND 0
#define MAP_TYPE_JUNGLE    1
#define MAP_TYPE_SNOW      2
#define MAP_TYPE_SAND      3
#define MAP_TYPE_MOUNTAIN  4
#define MAP_TYPE_VILLAGE   5
#define MAP_TYPE_FOREST    6

struct sTemplateBiom
{
    int tile_percent[TILE_COUNT];
};

struct sHole
{
    int x1, y1, x2, y2, h;
    float s;

    sHole(int a, int b, int a1, int b1, float c, int d)
    {
        x1 = a; y1 = b; x2 = a1; y2 = b1; s = c; h = d;
    }
};

class cMapGen
{
    private:
        bool ** map;//mapa
        bool ** tmp;//mapa tymczasowa
        int type;//typ mapy

        int ** holes;//dziury "pokolorowany liczbami"

        sTemplateBiom * biom;//ustawienia biomu do generowania

        std::vector <int> isDead, isLive;//ile potrzebuje sasiadow zeby ozyc i zeby pozostac przy zyciu
        int repeat;//ile razy ma potwarzać dane
        int wallLikely;//prawdopodobienstwo sciany

        void init();//inicjalizyje nasz generator map
        bool randTile();//losuje czy pole jest sciana czy jest puste
        void step();//kolejny krok

        void load_biom(int type);//laduje ustawienia biomu z pliku
        const char * getBiomNameByID(int ID);//zwraca nazwe biomu po ejgo ID

        int countFreeFields();
        int * randQueue();
        void randPos(int &x, int &y);

        int fillMap(int ** fMap, int x, int y, int tile, int v);
        int fillMap_flood(int x, int y, int tile, int &v);

        int countTilesBFS(int x, int y, int k);
        std::vector <sPoint> findWayToOtherHole(sPoint s);
        void doTunnel(std::vector <sPoint> way);
        float minimum(std::vector <float> v);
        sHole minimum(std::vector <sHole> v);

    public:
        int w, h;//szerokosc i wysokosc mapy w kafelkach
        int ** M;//właściwa mapa
        int ** M_G;//mapa zieleni

        void generate();
        void setParams(std::vector <int> live, std::vector <int> dead, int count);
        void draw();
        void texture();
        void linkHoles();//laczy dziury

        cMapGen(int width, int height, int percent, int t);
};

#endif
